/**
 * Git 提交信息验证脚本
 *
 * 此脚本用于验证 Git 提交信息是否符合项目的提交规范。
 * 采用 Conventional Commits 标准，确保提交信息格式的一致性，
 * 以支持自动化 changelog 生成和版本管理。
 *
 * @ts-check
 */
import pico from 'picocolors'
import { readFileSync } from 'node:fs'
import path from 'node:path'

// 读取 Git 提交信息文件的路径
const msgPath = path.resolve('.git/COMMIT_EDITMSG')
// 读取并去除提交信息的前后空格
const msg = readFileSync(msgPath, 'utf-8').trim()

/**
 * 提交信息格式正则表达式
 *
 * 格式规范：[revert: ]<type>[(scope)]: <description>
 * - revert: （可选）用于标识回滚提交
 * - type: 提交类型（feat, fix, docs, style, refactor, perf, test, workflow, build, ci, chore, types, wip, release）
 * - scope: （可选）影响范围，如 compiler, runtime 等
 * - description: 描述信息，限制 1-50 个字符
 *
 * 支持的提交类型：
 * - feat: 新功能
 * - fix: 修复 bug
 * - docs: 文档更新
 * - dx: 开发体验改进
 * - style: 代码风格改动（不影响代码运行）
 * - refactor: 代码重构（既不是新功能也不是 bug 修复）
 * - perf: 性能优化
 * - test: 测试相关
 * - workflow: 工作流程改动
 * - build: 构建系统或外部依赖变动
 * - ci: CI 配置和脚本变动
 * - chore: 其他不修改 src 或 test 文件的变动
 * - types: 类型定义相关变动
 * - wip: 工作进行中
 * - release: 版本发布
 */
const commitRE =
  /^(revert: )?(feat|fix|docs|dx|style|refactor|perf|test|workflow|build|ci|chore|types|wip|release)(\(.+\))?: .{1,50}/

/**
 * 验证提交信息格式
 * 如果不符合规范，输出错误信息和示例，然后退出
 */
if (!commitRE.test(msg)) {
  console.log()
  console.error(
    // 错误标题
    `  ${pico.white(pico.bgRed(' ERROR '))} ${pico.red(
      `invalid commit message format.`,
    )}\n\n` +
      // 错误说明
      pico.red(
        `  Proper commit message format is required for automated changelog generation. Examples:\n\n`,
      ) +
      // 正确示例 1：带作用域的新功能
      `    ${pico.green(`feat(compiler): add 'comments' option`)}\n` +
      // 正确示例 2：带 issue 号的 bug 修复
      `    ${pico.green(
        `fix(v-model): handle events on blur (close #28)`,
      )}\n\n` +
      // 提示查看详细规范
      pico.red(`  See .github/commit-convention.md for more details.\n`),
  )

  // 以错误状态退出，阻止提交
  process.exit(1)
}
